import re
import requests
from Crypto.Cipher import AES
from urllib.parse import urljoin

def DownloadM3U8(url):
    txt = requests.get(url,headers=headers).text
    # 删除首尾空白
    txt = txt.strip()
    # 解析
    ParseM3U8(txt)
# 解析
def ParseM3U8(txt):
    # 下面解析需要用到
    global key,iv
    tmp = txt.split("\n")
    for t in tmp:
        if "#EXT-X-KEY" in t:
            # print("key这一行")
            # #EXT-X-KEY:METHOD=AES-128,URI="enc.key",IV=0x00000000000000000000000000000000
            Fkey = re.compile("URI=\".*?\"")
            Fiv = re.compile("IV=.*")
            keyr = re.findall(Fkey,t)[0][5:-1]
            # from urllib.parse import urljoin
            # https://v.gsuus.com/play/6dBQxnXb/index.m3u8
            # key 与m3u8文件在同一域名 可替换 m3u8的网址
            keyu = urljoin(m3,keyr)
            key = requests.get(keyu, headers=headers).text
            if int(re.findall(Fiv,t)[0][3:-1],16) !=0:
                iv = int(re.findall(Fiv,t)[0][3:-1],16)
        # 不是 # 开头的 就是 ts文件地址
        elif t[0] != "#" :
            # print("key", key, "iv",iv )
            # print("ts-->",t)
            # 可以多线程调用
            DownloadTS(t)
            # 测试就 不 全下载了
            # 全下载 注释 下面的 break
            break
            pass
    pass
def DownloadTS(t):
    tsx = requests.get(t).content # 解码需要 bytes 类型
    tmp = t.split("/")
    name = tmp[-1]
    if key !='':
        # 拿去 先解密然后保存
        ParseTS(tsx,name)
    else:
        # 没有 key 不需要解密 直接保存
        SaveTS(tsx,name)
    pass
def ParseTS(tsx,filename):
    global key,iv # 调用全局变量
    # pip install Crypto 需要安装AES 解密模块
    # 如果保存 需要安装下面 因为 Crypto 已经GG了
    # pip install pycryptodome == 3.9.0
    AES_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv)# AES.MODE_CBC 表示模式是CBC模式 固定不需要理解
    # AES_obj.encrypt() # 加密
    txb = AES_obj.decrypt(tsx)
    SaveTS(txb,filename)

def SaveTS(ts,name):
    # w 写入 b 二进制
    with open(name, 'wb') as f:
        f.write(ts)
def TS2MP4():
    # 用的ffmpeg -i xxx.m3u8 -c copy xx.mp4
    # ffmpeg 需要自己装
    pass

if __name__ == '__main__':
    key = ''
    iv =b'0000000000000000'
    ua = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
    headers = {'User-Agent':ua,'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7'}
    # Testurl  = "https://v.gsuus.com/play/6dBQxnXb"
    # 上面省略一顿7搞8搞
    m3 = "https://v.gsuus.com/play/6dBQxnXb/index.m3u8"
    DownloadM3U8(m3)